#include <opencv2/opencv.hpp>
#include <iostream>
#include <ctime>

using namespace cv;
using namespace std;

int main() {
    // 打开摄像头
    VideoCapture cap(40);

    // 检查摄像头是否正确打开
    if (!cap.isOpened()) {
        cout << "无法打开摄像头" << endl;
        return -1;
    }

    // 获取摄像头的默认分辨率
    int frame_width = cap.get(CAP_PROP_FRAME_WIDTH);
    int frame_height = cap.get(CAP_PROP_FRAME_HEIGHT);

    // 定义视频编解码器并创建 VideoWriter 对象
    VideoWriter video("output.avi", VideoWriter::fourcc('M', 'J', 'P', 'G'), 20, Size(frame_width, frame_height));

    // 检查视频文件是否成功打开
    if (!video.isOpened()) {
        cout << "无法创建视频文件" << endl;
        return -1;
    }

    // 不断循环，读取视频帧并写入输出视频文件
    while (true) {
        Mat frame;
        // 从摄像头捕获一帧图像
        cap >> frame;

        // 如果帧读取失败，则退出循环
        if (frame.empty()) {
            cout << "无法读取帧" << endl;
            break;
        }

        // 获取当前时间
        time_t now = time(0);
        struct tm *local_time = localtime(&now);
        char time_stamp[80];
        strftime(time_stamp, sizeof(time_stamp), "%Y-%m-%d %H:%M:%S", local_time);

        // 在图像上绘制时间戳
        putText(frame, time_stamp, Point(10, frame_height - 10), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(0, 255, 0), 1);

        // 将帧写入输出视频文件
        video.write(frame);

        // 检测键盘输入，按下ESC键退出循环
        if (waitKey(1) == 27) {
            break;
        }
    }

    // 释放摄像头资源、关闭输出视频文件
    cap.release();
    video.release();

    return 0;
}
